import {
    baseURL
} from '@/config'

// 请求拦截器
const httpInterceptor = {
    invoke(options) {
        // 1. 非 http 开头需拼接地址
        if (!options.url.startsWith('http')) {
            options.url = baseURL + options.url
        }

        // 2. 请求超时
        options.timeout = 10000

        // 3. 添加小程序端请求头标识
        options.header = {
            ...options.header,
            'source-client': 'miniapp'
        }

        // 4. 添加 token 请求头标识
        const token = uni.getStorageSync('token')
        if (token) {
            options.header.Authorization = `Bearer ${token}`
        }
    }
}

uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)

// 请求函数
function request(options) {
    return new Promise((resolve, reject) => {
        uni.request({
            ...options,
            success: (res) => {
                // 状态码 2xx
                if (res.statusCode >= 200 && res.statusCode < 300) {
                    resolve(res.data)
                } else if (res.statusCode === 401) {
                    // 401 未登录
                    const currentPage = getCurrentPages().pop()
                    // 非登录页面才跳转
                    if (currentPage?.route !== 'pages/login/index') {
                        uni.navigateTo({ url: '/pages/login/index' })
                    }
                    reject(res)
                } else {
                    // 其他错误
                    uni.showToast({
                        title: res.data?.message || '请求失败',
                        icon: 'none'
                    })
                    reject(res)
                }
            },
            fail: (err) => {
                uni.showToast({
                    title: '网络错误',
                    icon: 'none'
                })
                reject(err)
            }
        })
    })
}

export default request
